/**
 * 基础API请求地址（常量，全大写命名规范）
 * @type {string}
 * @constant
 */
let BASE_URL = 'http://localhost:8891'

/**
 * 封装的HTTP请求核心函数
 * @param {string} url - 请求的接口路径（不需要包含基础接口URL）
 * @param {Object} [data={}] - 请求参数，默认为空对象
 * @param {string} [method='GET'] - HTTP方法，默认GET,支持GET/POST/DELETE/PUT等
 * @returns {Promise} - 返回Promise便于链式调用
 *
 */
export default function http(url, data = {}, method = 'GET') {
	// 返回一个Promise对象，支持外部链式调用
	return new Promise((resolve, reject) => {
		// 调用uni-app的底层请求API
		uni.request({
			// 拼接完整请求地址（基础接口URL +  请求的接口路径）
			url: BASE_URL + url,

			// 请求参数（GET请求时会自动转为query string）
			data: data,

			// 请求方法（转换为大写保证兼容性）
			method: method.toUpperCase(),

			// 请求头配置
			header: {
				// 从本地存储获取token，没有就位空
				'token': uni.getStorageSync('token') || '',
				// 默认JSON格式
				'Content-Type': 'application/json'
			},

			// 请求成功回调（注意：只要收到服务器响应就会触发，无论HTTP状态码）
			success: (res) => {
				console.log('HTTP请求响应:', res);

				/* HTTP层状态码处理（4xx/5xx等也会进入success回调） */
				if (res.statusCode !== 200) {
					const errMsg = `[${res.statusCode}]${res.errMsg || '请求失败'}`
					showErrorToast(errMsg)
					// 使用Error对象传递更多错误信息
					reject(errMsg)
					return; // 添加return，避免继续执行
				}

				/* 业务层状态码处理 */
				console.log('服务器返回的数据:', res.data);

				// 检查服务器是否返回了预期的数据结构
				if (!res.data) {
					const errMsg = '服务器返回数据为空'
					showErrorToast(errMsg)
					reject(errMsg)
					return;
				}

				// 根据你的后端实际返回调整这里的判断条件
				// 使用 == 来处理字符串 "200" 和数字 200 的比较
				if (res.data.code == 200) {
					// 提取业务数据
					resolve(res.data)
				} else {
					// 业务错误处理
					const errMsg = res.data.msg || res.data.message || `业务错误[${res.data.code}]`
					showErrorToast(errMsg)
					reject(errMsg)
				}
			},

			// 请求失败回调（网络错误、超时等）
			fail: (err) => {
				const errMsg = `网络连接失败: ${err.errMsg || '未知错误'}`
				showErrorToast(errMsg)
				reject(new Error(errMsg))
			},


		})
	})
}

/**
 * 显示统一格式的错误提示（私有工具方法）
 * @param {string} message - 需要显示的错误信息
 * @private
 */
function showErrorToast(message) {
	uni.showToast({
		title: message, // 提示内容
		icon: 'none', // 不显示图标
		duration: 3000 // 3秒后自动关闭
	})
}
